package com.leetBook.Krahets.linkedList;

import org.junit.Test;

import java.util.LinkedList;

/**
 * 《图解算法与数据结构》链表第 1 题：图书整理
 * 输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）。
 */
public class Solution {
    /**
     * 最优解法，获取到链表长度后，从数组的最后一位开始遍历赋值
     * @param head 链表头结点
     * @return 倒序数组
     */
    public int[] reversePrint(ListNode head) {
        ListNode tmp = head;
        int len = 0;
        while (tmp != null){
            len ++;

            tmp = tmp.next;
        }

        int[] ints = new int[len];
        int count = len - 1;
        while (head != null){
            ints[count] = head.val;

            count --;
            head = head.next;
        }
        return ints;
    }

    /**
     * 次优解法，使用栈的思想，先入后出，出的时候放入结果数组中，比上一种方法多一倍的内存使用
     * @param head 链表头结点
     * @return 倒序数组
     */
    public int[] reversePrint1(ListNode head) {
        readHead(head);

        int[] ints = new int[list.size()];

        for (int i = 0; i < list.size(); i++) {
            ints[i] = list.get(i);
        }

        return ints;
    }

    LinkedList<Integer> list = new LinkedList();
    private void readHead(ListNode head){
        if (head == null){
            return;
        }

        int i = head.val;
        head = head.next;

        // 递归调用当前方法，形成栈
        readHead(head);

        list.add(i);
    }

    /**
     * 判断一个字符串是不是一个数值。数值前后可以有空格，前面可以有正负数符号、后面可以有科学计数法的 E/e
     * @param s 字符串
     * @return 是否是数值
     */
    public boolean isNumber(String s) {
        if (s == null){
            return false;
        }

        String trim = s.trim();

        if ("".equals(trim)){
            return false;
        }

        // 小数点标志
        boolean flag = true;

        char[] chars = trim.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char aChar = chars[i];
            if (i == 0){
                if (aChar != '+' && aChar != '-' && (aChar < '0' || aChar > '9')){
                    if (aChar == '.' && flag && chars.length != 1) {
                        flag = false;
                    }else {
                        return false;
                    }
                }
            }else if (i == chars.length-1){
                if (aChar != 'E' && aChar != 'e' && (aChar < '0' || aChar > '9')){
                    return false;
                }
            }else if (aChar == '.' && flag){
                flag = false;
            }else if(aChar < '0' || aChar > '9'){
                return false;
            }
        }

        return true;
    }

    @Test
    public void isNumberTest(){
        System.err.println(isNumber(" "));
//        System.err.println(isNumber(" +1.. "));
//        System.err.println(isNumber(" -1.22e "));
//        System.err.println(isNumber("dd"));
//        System.err.println(isNumber(" ds"));
//        System.err.println(isNumber(" ds.11"));
    }
}
